package persistencia.derby;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import persistencia.DAOException;
import persistencia.DAOFactory;
import persistencia.SubscriptionDAO;

/**
 * Clase que representa la factoria para el manejo de la Base de Datos, en este
 * utilizamos el gestor Derby.
 *
 * @author Nicolás Garay
 * @author Alejandro Jacquet
 * @author Rita Romani
 */
public class DerbyDAOFactory extends DAOFactory {

    /**
     * Atributo final que contiene el nombre del driver de la Base de Datos a
     * utilizar.
     */
    public final String DRIVER = "org.apache.derby.jdbc.ClientDriver"; 
    /**
     * Atributo final que la dirección en la cual se encuentra la Base de Datos.
     */
    public final String DURL = "jdbc:derby://localhost:1527/rss-db"; 

    /**
     * Constructor de la clase, en el cual se carga el driver de la Base de
     * Datos a utilizar.
     *
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Driver de la base de datos, no encontrado).
     */
    public DerbyDAOFactory() throws DAOException {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException ex) {
            throw new DAOException("Driver de la base de datos, no encontrado", ex);
        }
    }

    /**
     * Método que devuelve la conexión con la Base de Datos.
     *
     * @return Connection conexión con la Base de Datos.
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Error en la conexion a la base de datos).
     */
    @Override
    public Connection getConexion() throws DAOException {
        try {
            return DriverManager.getConnection(DURL, "taller", "taller2012");
        } catch (SQLException e) {
            throw new DAOException("Error en la conexion a la base de datos", e);
        }
    }

    /**
     * Método que cierra la conexión a la Base de Datos que le pasamos como
     * atributo.
     *
     * @param conexion objeto de la clase Connection que será cerrada su
     * conexión.
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Error al cerrar la conexion).
     */
    @Override
    public void closeConexion(Connection conexion) throws DAOException {
        try {
            conexion.close();
        } catch (SQLException e) {
            throw new DAOException("Error al cerrar la conexion", e);
        }
    }

    /**
     * Método abstracto que retorna un objeto de una clase que implementa la
     * interface SubscriptionDAO, en este caso la clase es DerbySubscriptionDAO.
     *
     * @return SubscriptionDAO
     */
    @Override
    public SubscriptionDAO getSubscriptionDAO() {
        return new DerbySubscriptionDAO();
    }
}
